//
//  TJStatusViewModel.swift
//  TJSinaWeibo
//
//  Created by 唐后能 on 16/4/13.
//  Copyright © 2016年 itheima. All rights reserved.
// 用户信息:
//https://api.weibo.com/2/statuses/home_timeline.json?access_token=2.00pfWe4GoLGfPB1685a27197TfVkVD

import UIKit
import SDWebImage

class TJStatusViewModel: NSObject {

    // 让status成为statusViewModel的属性.
    var status:TJStatus?
    
    // 是否正在加载微博数据.防止上拉下拉同时请求.
    private var isloadingStatus = false
    
    // 单例.
    static let shareStatusManager:TJStatusViewModel = TJStatusViewModel()
    
    // 私有化init方法.
    private override init() {
        super.init()
    }
    
    // 请求微博数据.
    func loadStatus(since_id: Int64, max_id: Int64,callBack:(statuModels:[TJStatus]?,error:NSError?)->()) {
    
        // 先判断是否有人正在执行网络请求.
        if isloadingStatus == true {
            // 表示网络请求还在执行中
            TJPrint("有人正在加载数据,请稍候.")
            return
        }
        // 一马上开始请求就将isloadingStatus该为yes.
        isloadingStatus = true
        
        // 3,调用DAL获取微博数据(自己不用关心是走网络还是本地数据库).
        TJStatusDALManager.shareDALManager.loadStatus(since_id, max_id: max_id) { (status, error) -> () in
            // 网络请求完成后,将isloadingStatus更改为false,允许下一个请求进行.
            self.isloadingStatus = false
            if error != nil {
                // 请求数据失败.
                TJPrint("请求微博数据失败:\(error)")
                // 失败回调.
                callBack(statuModels: nil,error: error)
            }
            
            // 守卫返回的数据.
            if status == nil {
            
                return
            }
            // 请求数据成功.
            // 创建可变的模型数组.
            var statusModels:[TJStatus] = []
            // 遍历字典,进行字典转模型.
            for dict in status! {
                
                let statu = TJStatus(dict: dict)
                statusModels.append(statu)
            }
            
            // 缓存图片.
            self.cacheSingleImage(statusModels, callBack: callBack)
        }
    }
    
    // 缓存单张图片.
    private func cacheSingleImage(statusModels:[TJStatus],callBack:(statuModels:[TJStatus]?,error:NSError?)->()) {
        
        // 需缓存的RUL数组.
        var URLDownloads:[NSURL]?
        
        // 创建按任务组.
        let group = dispatch_group_create()
        
        // 遍历所有模型,去除缓存图片.
        for statusModel in statusModels {
            
            // 可选绑定:如果原创微博中有图片URL,则将其赋值给需缓存的URL数组.
            if let urls = statusModel.picURLS {
            
                URLDownloads = urls
            }else {
                // 如果原创微博中没有图片,则给转发微博进行可选绑定.
                if let retweeteUrls = statusModel.retweeted_status?.picURLS {
                    URLDownloads = retweeteUrls
                }
            }
            // 看是否有图片需要缓存.
            if let picURLs = URLDownloads {
                
                // 有图片,过滤出只有一张图片的URL.
                if picURLs.count == 1 {
                    
                    let url = picURLs[0]
                    // 进入任务组.
                    dispatch_group_enter(group)
                    // 发请求,缓存图片.
                    SDWebImageManager.sharedManager().downloadImageWithURL(url, options: [], progress: nil, completed: { (image, error, _, _, _) -> Void in
                        // 离开任务组.
                        dispatch_group_leave(group)
                        // 若缓存失败,则回调.
                        if error != nil {
                            callBack(statuModels: nil, error: error)
                        }
                    })
                }
            }
        }
        
        // 待全部微博模型中的单张图片都缓存完成,才将数据回调给控制器.-->注意要主线程回调.
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            callBack(statuModels: statusModels, error: nil)
        }
    }
    
    // 发布微博.
    func sendStatus(text:String,image:UIImage?,sendResultCallBack:((error:NSError?)->())) {
    
        // 守卫access_Token.
        guard let access_token = TJAccountViewModel.shareUserAccount.userAccount?.access_token else {
        
            TJPrint("accss_token是空值")
            let error = TJNetWorkError.AcceseTokenEmpty.NetWorkError()
            sendResultCallBack(error: error)
            return
        }
        
        
        
        // 2,参数.
        let parameters = [
            "access_token": access_token,
            "status": text
        ]
        
        // 3,请求.
        if image == nil { // 没有图片的请求-->纯文本/属性文本.
            // urlString.
            let urlString = "https://api.weibo.com/2/statuses/update.json"
        
            TJNetWorkManager.shareNetWorkManager.POST(urlString, parameters: parameters, progress: nil, success: { (task, responseObject) -> Void in
                
                // 发送成功.
                sendResultCallBack(error: nil)
                
                }) { (task, error) -> Void in
                    // 发送失败.
                    sendResultCallBack(error: error)
            }
        }else { // 带图片的请求.
        
            // url
            let urlString = "https://upload.api.weibo.com/2/statuses/upload.json"

            TJNetWorkManager.shareNetWorkManager.POST(urlString, parameters: parameters, constructingBodyWithBlock: { (formData) -> Void in
                
                    // 用formData.append来拼接需要上传的二进制数据.
                let data = UIImagePNGRepresentation(image!)!
                formData.appendPartWithFileData(data, name: "pic", fileName: "", mimeType: "image/png")
                
                }, progress: nil, success: { (task, responseObject) -> Void in
                    // 成功回调.
                    sendResultCallBack(error: nil)
                }, failure: { (task, error) -> Void in
                    // 失败回调
                    sendResultCallBack(error: error)
            })
        }
        
        
    }
    
}
